热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【区块链|Polygon】Polygon区块链PHP开发包使用PHP语言开发Polygon

PolygonPHP开发包适用于为PHP应用快速增加对Polygon区块链数字资产的支持能力,即支持使用自有Polygon区块链节点的应用场景,也支持基于Polygon区块链官方节

Polygon PHP开发包适用于为PHP应用快速增加对Polygon区块链数字资产的支持能力, 即支持使用自有Polygon区块链节点的应用场景,也支持基于Polygon区块链官方节点API服务的 轻量级部署场景。官方下载地址:Polygon PHP开发包。

1、开发包概述

Polygon PHP开发包主要包含以下特性:

  • 支持Polygon区块链原生PHP转账交易及余额查询
  • 支持Polygon链上智能合约的部署与交互,支持ERC20/ERC721/ERC1155转账交易及到账跟踪
  • 支持Polygon链上交易的离线签名,避免泄露私钥
  • 支持使用自有节点或第三方节点,例如Polygon官方提供的公共节点

Polygon PHP软件包运行在 Php 7.1+ 环境下,当前版本1.0.0,主要类/接口及关系如下图所示:

Polygon PHP开发包的主要代码文件清单如下:

代码文件 说明
polygon.php/src/Kit.php Polygon PHP开发包入口类
polygon.php/src/Erc20.php ERC20智能合约封装类
polygon.php/src/Erc721.php ERC721智能合约封装类
polygon.php/src/Erc1155.php ERC1155智能合约封装类
polygon.php/src/SmartContract.php Polygon智能合约封装类
polygon.php/src/Credential.php Polygon区链上身份标识类,用于交易签名
polygon.php/src/NodeClient.php Polygon节点协议封装类
polygon.php/src/Callback.php Php回调辅助类
polygon.php/src/Helper.php 杂项辅助函数集
contracts/WizToken.sol 示例ERC20合约
contracts/WizNFT.sol 示例ERC721合约
contracts/WizMT.sol 示例ERC1155合约
bin/build-contracts.sh 合约编译脚本工具
demo/credential-demo.php 演示如何创建新的Polygon账号或导入已有私钥
demo/matic-demo.php 演示MATIC转账及查询
demo/erc20-demo.php 演示ERC20转账及查询
demo/erc20-event-demo.php 演示ERC20到账监听
demo/erc721-demo.php 演示ERC721转账及查询
demo/erc721-event-demo.php 演示ERC721到账监听
demo/erc1155-demo.php 演示ERC1155转账及查询
demo/erc1155-event-demo.php 演示ERC1155到账监听
demo/deploy-contracts-demo.php 演示代码,智能合约的部署
vendor 第三方依赖包目录
composer.json composer配置文件

2、使用示例代码

在使用示例代码之前,请按照实际情况设置demo/config.php中的以下配置信息:

  • NETWORK:要接入的区块链网络,可选:mainNet - Polygon主链, testNet - Polygon测试链
  • ALICE_ADDR:demo程序使用的主测试账号,该账号将用于部署代币合约、执行MATIC及ERC20/ERC721/ERC1155转账交易等操作,因此 需要有一定数量的MATIC余额。
  • ALICE_SK:主测试账号对应的私钥

2.1 Polygon链上地址创建与回复

demo/credential-demo.php演示了如何使用Polygon PHP开发包创建新的Polygon链上地址,或者导入已有私钥重建账号。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php credential-demo.php

执行结果如下:

2.2 MATIC转账及余额查询

demo/matic-demo.php演示了如何使用Polygon PHP开发包实现MATIC转账和余额查询。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php matic-demo.php

执行结果如下:

2.3 Polygon智能合约部署

demo/deploy-contracts-demo.php演示了如何使用Polygon PHP开发包部署ERC20/ERC721/ERC1155智能合约。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php deploy-contracts-demo.php

执行结果如下:

2.4 ERC20转账及查询

demo/erc20-demo.php演示了如何使用Polygon PHP开发包实现ERC20转账和余额查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-demo.php

执行结果如下:

2.5 ERC20到账跟踪

demo/erc20-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC20通证的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-event-demo.php

执行结果如下:

2.6 ERC721 NFT转让及查询

demo/erc721-demo.php演示了如何使用Polygon PHP开发包实现ERC721 NFT转让和查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-demo.php

执行结果如下:

2.7 ERC721 NFT到账跟踪

demo/erc721-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC721 NFT的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-event-demo.php

执行结果如下:

2.8 ERC1155转让及查询

demo/erc1155-demo.php演示了如何使用Polygon PHP开发包实现ERC1155转让和查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-demo.php

执行结果如下:

2.8 ERC1155到账跟踪

demo/erc1155-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC1155的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-event-demo.php

执行结果如下:

3、使用Polygon PHP开发包

Kit类是Polygon PHP开发包的入口,使用这个类可以快速实现如下功能:

  • MATIC转账与余额查询
  • ERC20代币转账、授权、余额查询等

3.1 Kit的实例化

Kit实例化需要传入NodeClient对象和Credential对象,这两个 参数分别封装了Polygon节点提供的API、以及进行交易签名的用户身份信息。

例如,下面的代码创建一个接入Polygon主链的Kit实例,并使用 指定的私钥进行交易签名:

1 2 3 4 5 6 7 8

//use polygon\Kit; //use polygon\NodeClient; //use polygon\Credential; $kit = new Kit( NodeClient::mainNet(), //接入主链 Credential::fromKey('0x87c12d....d435') //使用指定私钥 );

3.2 MATIC转账及余额查询

使用Kit对象的transfer()方法进行MATIC转账,例如发送0.1 MATIC:

1 2 3 4 5 6

//use polygon\Kit; $to = '0x90F8bf6...0e7944Ea8c9C1'; //转账目标地址 $amount = bn('100000000000000000'); //转账金额,按最小单位 $txid = $kit->transfer($to,$amount); //提交MATIC转账交易 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

注意:需要将金额转换为最小单位,由于MATIC的小数位数是18, 因此 0.1 MATIC = 100000000000000000 最小单位。

使用balanceOf()方法查询指定地址的MATIC余额,例如:

1 2 3

$addr = '0x90F8bf6...0e7944Ea8c9C1'; //要查询的Polygon链上地址 $balance = $kit->balanceOf($addr); //查询MATIC余额,按最小单位 echo 'balance => ' . $balance . PHP_EOL; //显示MATIC余额

3.3 ERC20转账

使用Kit对象的erc20()方法获取指定ERC20合约实例,然后调用合约 的transfer()方法进行ERC20转账。例如,下面的代码 指定地址间转账123.4567 USDT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):

1 2 3 4 5 6 7 8

//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //转账目标地址 $amount = bn('123456700'); //转账ERC20数量 $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $txid = $kit->erc20($contractAddr) ->transfer($to,$amount); //转账ERC20 echo 'txid => ' . $txid . PHP_EOL; //显示转账交易ID

3.4 ERC20余额查询

使用erc20()方法获取指定的ERC20合约实例,然后调用合约 的balanceOf()方法查询ERC20余额。例如,下面的代码查询指定地址 的USDT余额:

1 2 3 4 5 6

//use polygon\Kit; $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $balance = $kit->erc20($contractAddr) ->balanceOf('0x90F8bf6...0e7944Ea8c9C1'); //查询地址0x90F8...的USDT余额 echo 'balance => ' . $balance . PHP_EOL; //显示余额

3.5 ERC20到账跟踪

使用erc20()方法获取指定ERC20合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的USDT代币到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $events = $kit->erc20($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转账金额 }

getTransferEvents()方法返回的结果是一个事件对象数组,每个成员对象的主要字段 说明如下:

  • blockHash:事件触发的区块哈希
  • blockNumber:事件触发的区块号
  • transactionHash:触发事件的交易ID
  • address:事件触发的合约地址
  • name:事件名称,例如转账事件的名称为:Transfer
  • params:事件参数数组,例如转账事件包含以下三个参数:
    • from:转出账号
    • to:转入账号
    • value:转账数量

3.6 ERC721 NFT转让

使用Kit对象的erc721()方法获取指定ERC721合约实例,然后调用合约 的transferFrom()方法进行ERC721 NFT转账。例如,下面的代码 指定地址间转让编号为1278的ERC721 NFT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):

1 2 3 4 5 6 7 8

//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1278; //转让的NFT编号 $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $txid = $kit->erc721($contractAddr) ->transfer($to,$tokenId); //转让指定的ERC721 NFT echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

3.7 ERC721 NFT查询

使用Kit对象的erc721()方法获取指定的ERC721合约实例后,可以调用合约的方法查询NFT的 基本信息以及特定编号的NFT的持有人信息等。例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

//use Polygon\Kit; $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $nft = $kit->erc721($contractAddr); //返回ERC721合约实例 echo 'name => ' . $nft->name() . PHP_EOL; echo 'symbol => ' . $nft->symbol() . PHP_EOL; echo 'total supply =>' . $nft->totalSupply() . PHP_EOL; $tokenId = 1278; //NFT编号 echo 'owner => ' . $nft->ownerOf($tokenId); //返回指定NFT的持有人 echo 'token uri => ' . $nft->tokenURI($tokenId) . PHP_EOL; //返回指定NFT的元信息URI $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 echo 'total nfts => ' . $nft->balanceOf($user) . PHP_EOL; //用户持有的NFT总数

3.8 ERC721 NFT到账跟踪

使用erc721()方法获取指定ERC721合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定NFT合约到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $events = $kit->erc721($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'tokenId => ' . $event->params['tokenId'] . PHP_EOL; //转让的NFT编号 }

3.9 ERC1155转帐

使用Kit对象的erc1155()方法获取指定ERC1155合约实例,然后调用合约 的safeTransferFrom()方法进行ERC1155转账。例如,下面的代码 指定地址间转帐编号为1的ERC1155 NFT(合约地址:0xafefbbab1038a4fd475d685c11b07bd697e20e38):

1 2 3 4 5 6 7 8 9 10

//use polygon\Kit; $from = $kit->getSender(); //转出地址 $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1; //转让的通证编号 $value = 1000000; //转让数量 $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $txid = $kit->erc1155($contractAddr) ->safeTransferFrom($from, $to,$tokenId, $value); //转让指定的ERC1155通证 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

3.10 ERC1155查询

使用Kit对象的erc1155()方法获取指定ERC1155合约实例后,可以调用合约的balanceOf()方法 查询用户持有的ERC1155通证数量。例如:

1 2 3 4 5 6 7 8

//use Polygon\Kit; $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $mt = $kit->erc1155($contractAddr); //返回合约实例 $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 $tokenId = 1; //通证编号 echo 'banalce => ' . $mt->balanceOf($user, $tokenId); //用户持有的指定编号通证的数量

3.11 ERC1155到账跟踪

使用Kit对象的erc1155()方法获取指定的ERC1155合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定ERC1155通证到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $events = $kit->erc1155($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'id => ' . $event->params['id'] . PHP_EOL; //转让的通证编号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转让的通证数量 }

4、Polygon区块链身份与地址表示

在Polygon PHP开发包中,使用Credential对象表征区块链上的一个用户身份,使用普通的 字符串表征区块链上的一个地址,这两者的区别在于Credential包含了用户 的私钥信息,可以用来签名交易,因此需要保护。

使用Credential类的静态方法create()创建新账户。例如,下面的代码创建一个 新的账户并显示其私钥、公钥和地址:

1 2 3 4 5 6

//use polygon\Credential; $credential = Credential::create(); //创建新账号 echo 'private key => ' . $credential->getPrivateKey() . PHP_EOL; //显示私钥 echo 'public key => ' . $credential->getPublicKey() . PHP_EOL; //显示公钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示地址

可以使用静态方法fromKey()导入已有的私钥来实例化Credential。 例如下面的代码导入已有私钥并显示地址:

1 2 3 4

//use polygon\Credential; $credential = Credential::fromKey('0x7889...023a'); //导入已有私钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示相应地址

5、使用NodeClient

NodeClient类封装了Polygon节点的RPC访问协议。实例化NodeClient时,需要指定要连接 的节点URL,例如使用本地的全节点:

1 2 3

//use polygon\NodeClient; $client = new NodeClient('http://localhost:8545');

当使用Polygon官方节点时,NodeClient类也提供列两个静态函数mainNet()testNet(),分别 用于接入官方提供的主链节点和测试链节点。

例如,下面的代码是等效的:

1 2 3 4 5 6 7

//use polygon\NodeClient; $client = new NodeClient('https://rpc-mainnet.maticvigil.com'); $tc = NodeClient::mainNet(); //与上面等效 $tc = new NodeClient('https://rpc-mumbai.maticvigil.com'); $tc = NodeClient::testNet(); //与上面等效


推荐阅读
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
author-avatar
杭州琦琦妈_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有